package com.swak.consistency.tcc.role.impls;

import com.swak.consistency.tcc.context.Phase;
import com.swak.consistency.tcc.context.TccContext;
import com.swak.consistency.tcc.context.TransLog;
import com.swak.consistency.tcc.role.Role;

/**
 * 重试的业务： 只处理确认和取消
 * 
 * @author DELL
 */
public class TransRetryer extends TransProvider {

	@Override
	public Object doHandle(TccContext context) {

		// 事务日志
		TransLog trans = context.getTrans();

		// 事务角色
		Role role = Role.valueOf(trans.getRole());

		// 事务执行的阶段
		Phase phase = Phase.valueOf(trans.getPhase());

		// 事务发起者
		if (role == Role.INITIATOR) {

			// 准备阶段执行成功，或者进入了确认阶段
			if (phase == Phase.TRYED || phase == Phase.CONFIRMING) {
				this.confirmPhase(context);
			}
			// 准备阶段执行失败，或者进入了取消阶段
			else {
				this.cancelPhase(context);
			}
		}

		// 事务提供者
		else if (role == Role.PROVIDER) {
			// 明确进入确认阶段
			if (phase == Phase.CONFIRMING) {
				this.confirmPhase(context);
			}
			// 明确进入取消阶段
			else if (phase == Phase.CANCELING) {
				this.cancelPhase(context);
			}
		}
		return null;
	}
}
